
// 滑动窗口
/**
 * 
维护一个不包含重复字符的窗口 [left, right]
右指针 right 不断向右扩展窗口
当遇到重复字符时，左指针 left 移动到重复字符的下一个位置
始终记录窗口的最大长度
输入: s = "abcabcbb"
输出: 3 //"abc"
 * 
 */
function lengthOfLongestSubstring1(s: string): number {
    // 使用 Map 存储字符和其最新出现的位置
    const charMap = new Map<string, number>();
    let maxLength = 0;
    let left = 0; // 滑动窗口的左边界

    for (let right = 0; right < s.length; right++) {
        const currentChar = s[right];

        // 如果字符已经在窗口中，移动左边界
        if (charMap.has(currentChar) && charMap.get(currentChar)! >= left) {
            left = charMap.get(currentChar)! + 1;
        }

        // 更新字符的最新位置
        charMap.set(currentChar, right);

        // 更新最大长度
        maxLength = Math.max(maxLength, right - left + 1);
    }

    return maxLength;
}